﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Threading;

namespace TryTM
{
    public partial class frmMain : Form
    {
        Thread thread_Create_Local_View;

        public void Create_Local_View_in_THREAD(object ParentThread)
        {
            //не забыть 
            try
            {
                Change_Menu_Item(false);
                //не забыть проверять, существуют ли файлы (а то мало ли какую пакость придумает коварный тостер)
                string CurFileName;
                string CurFileExtention;
                foreach (DataRow mi in DataTable_UsedFiles.Rows)
                {
                    CurFileName = mi[ClassMainTableColumns.FullPathToFile].ToString();
                    Add_To_RichBox("Начата обработка документа " + CurFileName);
                    if (!File.Exists(CurFileName))
                    {
                        Add_To_RichBox("Документа " + CurFileName+" не существует.");
                    }
                    else
                    {
                        CurFileExtention = System.IO.Path.GetExtension(CurFileName).Trim().ToLower();
                        UsedFileExtentions.CreateViewOfCertainFileType(CurFileExtention, CurFileName);
                        mi[ClassMainTableColumns.FileIsUsed] = ClassUsedOrNotUsed.FileWasUsed; //не забыть отметить, по каким докам в итоге было создано представление
                    }
                    Add_To_RichBox("Закончена обработка документа " + CurFileName);
                }
                Add_To_RichBox("Подчёт TF*IDF.");
                Calculate_TF_IDF(); //считаем TF*IDF для слов
                Add_To_RichBox("Определение ключёвых слов.");
                Find_KeyWords(); //Ищем ключевые слова по TF*IDF
                Add_To_RichBox("Закончилось создание представления документов.");
                Refresh_DataGridKeyWords();
                Refresh_DataGridFoundAuthors();
                Refresh_DataGridFoundUDK();
                Change_Menu_Item(true);
            }
            catch(Exception Ex)
            {
                MessageBox.Show(Ex.Message);
                Thread.CurrentThread.Abort();
            }
        }

        public void Create_Local_View_not_in_Thread()
        {
            Add_To_RichBox("Начато создание представления для документов...");
            //пофиксить из списка файлов лишнее
            List<DataRow> RowsToDelete = (from DataRow mi in DataTable_UsedFiles.Rows
                                     where mi[ClassMainTableColumns.FileAddDelete].ToString() == ClassAddDeleteNoChange.FileToDelete
                                     select mi).ToList();
            foreach (DataRow mi in RowsToDelete)
            {
                DataTable_UsedFiles.Rows.Remove(mi);
                mi.Delete();
            }
            dataGridView_UsedFiles.Refresh();
            Add_To_RichBox("Из списка документов удалены документы, помеченные на удаление.");
            foreach (DataTable mi in DataSet_UsedFiles.Tables)
            {
                if (mi != DataTable_UsedFiles)
                {
                    mi.Rows.Clear();
                }
            }
            thread_Create_Local_View = new Thread(Create_Local_View_in_THREAD); //вынесение создание представления в отдельный процесс
            thread_Create_Local_View.Start(Thread.CurrentThread);
            dataGridView_UsedFiles.Refresh();
        }

        public int Get_Next_Symbol_Code(StreamReader SReader, int WhatLanguage)
        {
            char[] BufferNya = new char[1];
            int NotEnd = 1;
            int WhatUnicode = -1;
            while ((NotEnd > 0) && (DetectLanguage(WhatUnicode) != WhatLanguage))
            {
                NotEnd = SReader.ReadBlock(BufferNya, 0, 1);
                WhatUnicode = (int)BufferNya[0]; //здесь мы, наконец, получили юникод!!!
            }
            if (NotEnd > 0) return WhatUnicode;
            else return -1;
        }

        public void Add_To_Table_With_Local_View(int Word_ID, int FileID, int Position)
        {
            DataRow CurRow = DataTable_WORD_FILE_POSITION.NewRow();
            CurRow[Class_Table_WORD_FILE_POSITION_Columns.ID_FullPathToFile] = FileID;
            CurRow[Class_Table_WORD_FILE_POSITION_Columns.ID_Word] = Word_ID;
            CurRow[Class_Table_WORD_FILE_POSITION_Columns.PositionInFile] = Position;
            DataTable_WORD_FILE_POSITION.Rows.Add(CurRow);
        }

        public int Add_To_Table_With_Files_And_Words(DataTable DataTable_FILES, string ID_column_Name,
            string just_column_name, string FileName, string ExtraColumnWithLanguage, int Language)
        {// я поленилась писать и для слов и для файлов разные процедуры, поскольку уж очень они похожи. DataTable_FILES - таблица, ID_column_Name - имя колонки с айдишником, just_column_name - имя колонки без айдишника, FileName - значение, которое добавится, если его не было в таблице. Процедура возвращает айдишник добавленной\найденной записи 
            List<DataRow> Have_Already_The_Same = (from DataRow mi in DataTable_FILES.Rows
                                                   where mi[just_column_name].ToString() == FileName
                     select mi).ToList<DataRow>();
            if (Have_Already_The_Same.Count > 0)
            {
                return (int)Have_Already_The_Same[0][ID_column_Name];
            }
            else
            {
                DataRow CurRow = DataTable_FILES.NewRow();
                CurRow[just_column_name] = FileName;
                if (ExtraColumnWithLanguage != null)
                {
                    CurRow[ExtraColumnWithLanguage] = Language;
                }
                DataTable_FILES.Rows.Add(CurRow);
                return (int)CurRow[ID_column_Name];
            }
        }

        public void Add_To_Table_With_Local_View_ChineseFile(StreamReader SReader, int CurUnicode, string FileName, int WhatLanguage)
        {
            int Word_id;
            int File_id;
            int Position = 0;
            while (CurUnicode >= 0)
            {
                File_id = Add_To_Table_With_Files_And_Words(DataTable_FILES, Class_Table_FILES_Columns.ID_FullPathToFile,
                    Class_Table_FILES_Columns.FullPathToFile, FileName, Class_Table_FILES_Columns.FileLanguage, WhatLanguage);
                Word_id = Add_To_Table_With_Files_And_Words(DataTable_WORDS, Class_Table_WORDS_Columns.ID_Word,
                    Class_Table_WORDS_Columns.Word, CurUnicode.ToString(), null, WhatLanguage);
                Add_To_Table_With_Local_View(Word_id, File_id, Position);
                Position++;
                CurUnicode = Get_Next_Symbol_Code(SReader, WhatLanguage);
            }
        }
        public void Add_To_Table_With_Local_View_RussiaFile(String[] strArr, string FileName, int WhatLanguage)
        {
            int Word_id;
            int File_id;
            int Position = 0;
            foreach (string word in strArr)
            {
                int NyaNya;
                if (!String.IsNullOrEmpty(word)&&!StopWords(word)&&!int.TryParse(word.Trim().ToLower(),out NyaNya))
                {
                    string leksemWord = Leksem.GetStem(word);
                    File_id = Add_To_Table_With_Files_And_Words(DataTable_FILES,
                                                                Class_Table_FILES_Columns.ID_FullPathToFile,
                                                                Class_Table_FILES_Columns.FullPathToFile, FileName,
                                                                Class_Table_FILES_Columns.FileLanguage, WhatLanguage);
                    Word_id = Add_To_Table_With_Files_And_Words(DataTable_WORDS, Class_Table_WORDS_Columns.ID_Word,
                                                                Class_Table_WORDS_Columns.Word, leksemWord.Trim().ToLower(), null, WhatLanguage);
                    Add_To_Table_With_Local_View(Word_id, File_id, Position);
                    Position++;
                    //CurUnicode = Get_Next_Symbol_Code(SReader, WhatLanguage); // УЧТИ, ЧТО В КИТАЙСКОМ НЕТ ПРОБЕЛОВ, ПРОЦЕДУРА РАССЧИТАНА НА ЭТО

                }

                //максмально пыталась не видоизменять твое ...ту на самом деле вообще многое можно вынести в процедуры отедльные, чтоб не переиспользовать
                //но не обращай внимания,это мой глюк-меня рома просто по этому долго гонял
                // чобственно что я не поняла...во-первых таместь закоменченное место, где падало при запуске
                // глянешь в истории,ок?
                // еще хоть убей не понмиаю зачем тебе в Add_To_Table_With_Files_And_Words передавать CurUnicode??? зачем??

                
            }
        }

    }
}
